package com.example.mybatisplusdemo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.mybatisplusdemo.pojo.User;
import com.example.mybatisplusdemo.pojo.bsf;
import com.example.mybatisplusdemo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

/**
 * TODO   简单的 mybatis-plus 使用，实际业务中根据需求进行修改
 *
 * @ClassName UserController
 * @Author xiaojiang
 * @Date 2021/10/25 下午 15:09
 */
@RestController
public class UserController {

//    @Autowired
    @Resource
    UserService userService;

    /*---------------------------- 基本的CURD -----------------------------------------------*/
    /**
     *  TODO  查询所有用户
     *
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 15:56
     */
    @GetMapping("get-list")
    public List<User> getList(){

        return userService.getList();
    }

    @GetMapping("get-bsf-list")
    public List<bsf> getBSFList(){

        return userService.getBSFList();
    }

    /**
     *  TODO  添加一个用户
     * @Param : name
     * @Param : age
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 16:04
     */
    @RequestMapping("/insert")
    public String insertUser(@RequestParam(name = "name") String name,
                             @RequestParam(name = "age") Integer age) {
        User user = new User();
        user.setName(name);
        user.setAge(age);
        //在实体类使用了@TableId注解，ID会自动生成
        int i = userService.insertOne(user);
        return i == 1 ? "success" : "fail";
    }

    /**
     *  TODO  修改一个用户
     * @Param : id
     * @Param : name
     * @Param : age
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 15:59
     */
    @RequestMapping("/update")
    public String updateUser(@RequestParam(name = "id") String id,
                             @RequestParam(name = "name",required = false) String name,
                             @RequestParam(name = "age",required = false) Integer age) {
        User user = new User();
        user.setId(id);
        user.setName(name);
        user.setAge(age);
        int i = userService.updateOne(user);
        return i == 1 ? "success" : "fail";
    }

    /**
     *  TODO  删除一个用户
     * @Param : id
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 16:00
     */
    @RequestMapping("/delete")
    public String deleteUser(@RequestParam(name = "id") String id) {
        int i = userService.deleteOne(id);
        return i == 1 ? "success" : "fail";
    }

    /**
     *  TODO   批量删除用户
     * @Param : ids  多个id之间用英文逗号隔开
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 16:02
     */
    @RequestMapping("/deleteBatch")
    public String deleteBatchUser(@RequestParam(name = "ids") String ids) {
        List<String> list = Arrays.asList(ids.split(","));
        int i = userService.deleteBatch(list);
        return i == list.size() ? "success" : "fail";
    }

    /*---------------------------- 条件构造器(Wrapper) -----------------------------------------------*/
    /*Wrapper通俗点理解就是定义where语句后面的查询条件，
    是Mybatis-Plus里功能比较强大的工具，
    Wrapper是一个抽象类，下面有很多子类
    常用的子类实现有四个，分别是：
        QueryWrapper       :     主要用于生成where条件
        UpdateWrapper      :     上述的设置条件的方法都有，不同的是，UpdateWrapper会有set()和setSql()设置更新的值
        LambdaQueryWrapper :     用LambdaQueryWrapper的好处在于消除硬编码
        LambdaUpdateWrapper:     跟上面差不多，LambdaUpdateWrapper也可以消除硬编码
        */
    /*---------------------------- QueryWrapper -----------------------------------------------*/
    /**
     *  TODO  用name查询user表
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:47
     */
    @RequestMapping("/queryUserByName")
    public List<User>  queryUserByName(@RequestParam(name = "name") String name) {
        return userService.queryUserByName(name);
    }

    /**
     *  TODO   like查询
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:47
     */
    @RequestMapping("/queryUserLikeName")
    public List<User> queryUserLikeName(@RequestParam(name = "name") String name) {
        return  userService.queryUserLikeName(name);
    }

    /**
     *  TODO  过滤字段为空的
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:47
     */
    @RequestMapping("/queryUserByNameNotNull")
    public List<User> queryUserByNameNotNull() {
        return userService.queryUserByNameNotNull();
    }

    /**
     *  TODO IN查询
     * @Param : ids
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:48
     */
    @RequestMapping("/queryUserByIds")
    public List<User> queryUserByIds(@RequestParam(name = "ids") String ids) {
        List<String> list = Arrays.asList(ids.split(","));
        return userService.queryUserByIds(list);
    }

    /**
     *  TODO  排序
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:49
     */
    @RequestMapping("/queryUserOrderByAge")
    public List<User> queryUserOrderByAge() {
        return userService.queryUserOrderByAge();
    }

    /**
     *  TODO   子查询
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:49
     */
    @RequestMapping("/queryUserInSql")
    public List<User> queryUserInSql() {
        return userService.queryUserInSql();
    }

    /*-------------------------------- UpdateWrapper ------------------------------------------------*/
    /**
     *  TODO   根据 id 修改一个参数
     * @Param : id
     * @Param : name
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 17:47
     */
    @RequestMapping("/updateUserNameById")
    public String updateUserNameById(@RequestParam(name = "id") String id,
                                     @RequestParam(name = "name") String name) {
        int i = userService.updateUserNameById(id,name);
        System.out.println("返回的int：" + i);
        return i == 1 ? "success" : "fail";
    }

    /**
     *  TODO   setSql()就是设置SET关键字后面拼接的部分SQL语句
     *         setSql()就是纯粹的SQL语句拼接，我们可以看到SET后面接的是name=''，而不是占位符，会有SQL注入的风险
     * @Param : id
     * @Param : name
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 18:07
     */
    @RequestMapping("/updateUserBySql")
    public String updateUserBySql(@RequestParam(name = "id") String id,
                                     @RequestParam(name = "name") String name) {
        int i = userService.updateUserBySql(id,name);
        System.out.println("返回的int：" + i);
        return i == 1 ? "success" : "fail";
    }

    /*----------------------------- LambdaQueryWrapper -----------------------------------------------*/
    /**
     *  TODO  消除硬编码的用name查询user表
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 18:09
     */
    @RequestMapping("/lambdaQueryUserByName")
    public List<User>  lambdaQueryUserByName(@RequestParam(name = "name") String name) {
        return userService.lambdaQueryUserByName(name);
    }

    /**
     *  TODO   消除硬编码的模糊查询
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 18:10
     */
    @RequestMapping("/lambdaQueryUserLikeName")
    public List<User> lambdaQueryUserLikeName(@RequestParam(name = "name") String name) {
        return  userService.lambdaQueryUserLikeName(name);
    }

    /*---------------------------- LambdaUpdateWrapper -----------------------------------------------*/
    /**
     *  TODO  消除硬编码的进行修改
     * @Param : id
     * @Param : name
     * @return String
     * @Author 江
     * @Date 2021/10/25 下午 18:11
     */
    @RequestMapping("/lambdaUpdateUserNameById")
    public String lambdaUpdateUserNameById(@RequestParam(name = "id") String id,
                             @RequestParam(name = "name",required = false) String name) {
        int i = userService.lambdaUpdateUserNameById(id,name);
        return i == 1 ? "success" : "fail";
    }

    /*------------------------------------ 分页查询 --------------------------------------------------*/

    @RequestMapping("/queryPage/ByName")
    public IPage<User> selectPageByName(@RequestParam("pageNo") long pageNo,
                                        @RequestParam("pageSize") long pageSize,
                                        @RequestParam("name") String name) {
        return userService.selectPageByNameTwo(pageNo, pageSize, name);
    }




}
